﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AppManagement.UserManagers
{
    #region Using
    using AppManagement.Helpers;
    using AppManagement.Repositories;
    using DevComponents.DotNetBar;
    using System.Windows.Forms;
    #endregion

    public class GlobalUserManagers
    {
        /// <summary>
        /// Retrieve name from enum function
        /// </summary>
        /// <param name="chucnang"></param>
        /// <returns></returns>
        public static string RetrieveTenChucNang(EnumChucNangHeThong chucnang)
        {
            var tenchucnang = "";
            switch (chucnang)
            {
                // NGUOI DUNG
                case EnumChucNangHeThong.QUANTRINGUOIDUNG:
                    tenchucnang = "Quản trị người dùng";
                    break;
                case EnumChucNangHeThong.THAYDOIMATKHAU:
                    tenchucnang = "Thay đổi mật khẩu";
                    break;
                case EnumChucNangHeThong.NHACUNGCAP:
                    tenchucnang = "Nhà cung cấp";
                    break;
                case EnumChucNangHeThong.CHINHANH:
                    tenchucnang = "Chi nhánh";
                    break;
                case EnumChucNangHeThong.LOAITHIETBI:
                    tenchucnang = "Loại thiết bị";
                    break;
                case EnumChucNangHeThong.THIETBI:
                    tenchucnang = "Thiết bị";
                    break;
                case EnumChucNangHeThong.LAPPHIEUYEUCAU:
                    tenchucnang = "Lập phiếu yêu cầu";
                    break;
                case EnumChucNangHeThong.LAPPHIEUDATHANG:
                    tenchucnang = "Lập phiếu đặt hàng";
                    break;
                case EnumChucNangHeThong.QUANLY_PHIEUYEUCAU:
                    tenchucnang = "Quản lý phiếu yêu cầu";
                    break;
                case EnumChucNangHeThong.QUANLY_PHIEUDATHANG:
                    tenchucnang = "Quản lý phiếu đặt hàng";
                    break;
                case EnumChucNangHeThong.QUANLY_PHIEUNHAPKHO:
                    tenchucnang = "Quản lý phiếu nhập kho";
                    break;
                case EnumChucNangHeThong.QUANLY_PHIEUXUATKHO:
                    tenchucnang = "Quản lý phiếu xuất kho";
                    break;
                case EnumChucNangHeThong.THONGKE_TONKHO:
                    tenchucnang = "Thống kê tồn kho";
                    break;
            }
            return tenchucnang;
        }

        /// <summary>
        /// Retrieve enum function from name
        /// </summary>
        /// <param name="chucnang"></param>
        /// <returns></returns>
        public static EnumChucNangHeThong RetrieveFuncsNotAllowUsing(string tenchucnang)
        {
            EnumChucNangHeThong func = EnumChucNangHeThong.QUANTRINGUOIDUNG;
            if (tenchucnang == "Quản trị người dùng")
            {
                func = EnumChucNangHeThong.QUANTRINGUOIDUNG;
            }
            else if (tenchucnang == "Thay đổi mật khẩu")
            {
                func = EnumChucNangHeThong.THAYDOIMATKHAU;
            }
            else if (tenchucnang == "Nhà cung cấp")
            {
                func = EnumChucNangHeThong.NHACUNGCAP;
            }
            else if (tenchucnang == "Chi nhánh")
            {
                func = EnumChucNangHeThong.CHINHANH;
            }
            else if (tenchucnang == "Loại thiết bị")
            {
                func = EnumChucNangHeThong.LOAITHIETBI;
            }
            else if (tenchucnang == "Thiết bị")
            {
                func = EnumChucNangHeThong.THIETBI;
            }
            else if (tenchucnang == "Lập phiếu yêu cầu")
            {
                func = EnumChucNangHeThong.LAPPHIEUYEUCAU;
            }
            else if (tenchucnang == "Lập phiếu đặt hàng")
            {
                func = EnumChucNangHeThong.LAPPHIEUDATHANG;
            }
            else if (tenchucnang == "Quản lý phiếu yêu cầu")
            {
                func = EnumChucNangHeThong.QUANLY_PHIEUYEUCAU;
            }
            else if (tenchucnang == "Quản lý phiếu đặt hàng")
            {
                func = EnumChucNangHeThong.QUANLY_PHIEUDATHANG;
            }
            else if (tenchucnang == "Quản lý phiếu nhập kho")
            {
                func = EnumChucNangHeThong.QUANLY_PHIEUNHAPKHO;
            }
            else if (tenchucnang == "Quản lý phiếu xuất kho")
            {
                func = EnumChucNangHeThong.QUANLY_PHIEUXUATKHO;
            }
            else if (tenchucnang == "Thống kê tồn kho")
            {
                func = EnumChucNangHeThong.THONGKE_TONKHO;
            }
            return func;
        }

        /// <summary>
        /// Mapping name of controls with specifed enums so that enable or disable some functions for each users
        /// </summary>
        /// <returns></returns>
 
        public static Dictionary<string, EnumChucNangHeThong> InitFuncsMapping()
        {
            var dict = new Dictionary<string, EnumChucNangHeThong>();

            dict.Add("menQuanLyLoaiNguoiDung", EnumChucNangHeThong.QUANTRINGUOIDUNG);
            dict.Add("menQuanLyNguoiDung", EnumChucNangHeThong.QUANTRINGUOIDUNG);
            dict.Add("menQuanLyChucNangNhomNguoiDung", EnumChucNangHeThong.QUANTRINGUOIDUNG);
            dict.Add("menDoiMatKhau", EnumChucNangHeThong.THAYDOIMATKHAU);

            dict.Add("menNhaCungCap", EnumChucNangHeThong.NHACUNGCAP);
            dict.Add("menChiNhanh", EnumChucNangHeThong.CHINHANH);
            dict.Add("menLoaiThietBi", EnumChucNangHeThong.LOAITHIETBI);
            dict.Add("menThietBi", EnumChucNangHeThong.THIETBI);

            dict.Add("ttbtnLapPhieuYeuCau", EnumChucNangHeThong.LAPPHIEUYEUCAU);
            dict.Add("ttbtnLapPhieuDatHang", EnumChucNangHeThong.LAPPHIEUDATHANG);
            dict.Add("ttbtnQuanLyPhieuYeuCau", EnumChucNangHeThong.QUANLY_PHIEUYEUCAU);
            dict.Add("ttbtnQuanLyPhieuDatHang", EnumChucNangHeThong.QUANLY_PHIEUDATHANG);
            dict.Add("ttbtnQuanLyPhieuNhapKho", EnumChucNangHeThong.QUANLY_PHIEUNHAPKHO);
            dict.Add("ttbtnQuanLyPhieuXuatKho", EnumChucNangHeThong.QUANLY_PHIEUXUATKHO);
            dict.Add("ttbtnTonKho", EnumChucNangHeThong.THONGKE_TONKHO);

            return dict;
        }

        public static List<EnumChucNangHeThong> InitFuncsAllowUsing()
        {
            var lstAllFuncs = CHUCNANGRepository.SelectAll();
            var lstFuncsBelongToUser = CHUCNANG_LOAINGUOIDUNGRepository.SelectByMaLoaiNguoiDung(GlobalVariables.g_CurrentUser.LOAINGUOIDUNG.LOAI_NGUOI_DUNG_ID);
            var lst = new List<EnumChucNangHeThong>();
            foreach (var item in lstAllFuncs)
            {
                foreach (var item2 in lstFuncsBelongToUser)
                {
                    if (item.CHUCNANG_ID == item2.CHUCNANG_ID)
                    {
                        lst.Add(RetrieveFuncsNotAllowUsing(item.TEN_CHUC_NANG));
                        break;
                    }
                }
            }
            return lst;
        }

        private static void DisableCtrls(Panel pnlMain, string shortcut)
        {
            foreach (Control objControl in pnlMain.Controls)
            {
                if (objControl.GetType() == typeof(MenuStrip))
                {
                    foreach (ToolStripMenuItem _item in ((MenuStrip)objControl).Items)
                    {
                        DiableMenuItem(_item, shortcut);
                    }
                }
                else if (objControl.GetType() == typeof(ToolStrip))
                {
                    foreach (var _item in ((ToolStrip)objControl).Items)
                    {
                        if (_item.GetType() == typeof(ToolStripButton))
                        {
                            DiableToolStripItem((ToolStripButton)_item, shortcut);
                        }
                    }
                }
                else if (objControl.GetType() == typeof(ExplorerBar))
                {
                    foreach (ExplorerBarGroupItem _item in ((ExplorerBar)objControl).Groups)
                    {
                        DiableButtonItem(_item, shortcut);
                    }
                }
            }
        }

        private static void DiableButtonItem(ExplorerBarGroupItem parentItem, string shortcut)
        {
            if (parentItem != null && parentItem.SubItems.Count > 0)
            {
                foreach (var _item in parentItem.SubItems)
                {
                    if (_item.GetType() == typeof(ButtonItem))
                    {
                        if (shortcut == ((ButtonItem)_item).Name)
                        {
                            ((ButtonItem)_item).Enabled = true;
                            return;
                        }
                    }
                }
            }
        }

        private static void DiableToolStripItem(ToolStripButton parentItem, string shortcut)
        {
            if (parentItem.Name == shortcut)
            {
                parentItem.Enabled = true;
            }
        }

        private static void DiableMenuItem(ToolStripMenuItem parentItem, string shortcut)
        {
            if (parentItem != null)
            {
                foreach (var _item in parentItem.DropDownItems)
                {
                    if (_item.GetType() == typeof(ToolStripMenuItem))
                    {
                        DiableMenuItem((ToolStripMenuItem)_item, shortcut);
                    }
                }
                if (parentItem.Name == shortcut)
                {
                    parentItem.Enabled = true;
                }
            }
        }

        /// <summary>
        /// Disable some functions that user not allow using
        /// </summary>
        public static void EnableFuncAllowUsing(Panel pnlMain, string ctrlName)
        {
            DisableCtrls(pnlMain, ctrlName);
        }
    }
}
